package com.projles;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.projles.util.Player;

public class AnimaisActivity extends Activity implements OnClickListener{

	private long TEMPO_LIMITE = 4000;
	private long QTDE_QUADROS_DE_LOADING = 10;
	private int NUM_RODADAS_DEFAULT = 10;

	private Button botao1;
	private Button botao2;
	private Button botao3;

	private MediaPlayer mp;

	private Player player;
	
	//Mapear o nome de um animal a sua imagem
	private HashMap<String, Integer> mapa;
	private HashMap<String, Integer> mapa_som;

	private List<String> nome_animais;
	private List<Integer> som_animais;

	private List<String> aux_resposta;

	private ImageView imagem_animais;

    private TextView mostraRodadas;
    private int numeroRodadas;
    
    private int rodadaAtual = 0;
    private int tempoParcial;
    private int idadeMental;
    
    private LinearLayout layoutCronometro;
	private int[] imgsCronometro;
	private int ponteiroCronometro = 0;
	private CountDownTimer contador;
	
	private boolean semclick = true;
	private boolean travado = false;
	private boolean tutorial = false;
	

	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		
		SharedPreferences config = getSharedPreferences(OpcoesActivity.PREFS_NAME, 0);
        numeroRodadas = config.getInt("num_rodadas", NUM_RODADAS_DEFAULT);
        
        boolean jaUsou = config.getBoolean("ja_usou_animais", false);
        
        if (!jaUsou) {
        	
        	tutorial = true;
        	
        	Intent i = new Intent(this, AjudaActivity.class);
    		i.putExtra("qual_jogo", "animais");
    		startActivityForResult(i, 0);
    		
    		rodadaAtual = -1;
        }
        
        SharedPreferences.Editor editor = config.edit();
        editor.putBoolean("ja_usou_animais", true);
        editor.commit();
        
        player = Player.getPlayer(this);
        aux_resposta = new ArrayList<String>();

        configuraSons();
        
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		tutorial = false;
	}

	public void onStart(){
		super.onStart();
		
		setContentView(R.layout.animais);
		
		carregaViews();
		setarParametrosIniciais();
		configuraCronometro();
		
		String som_animal = aux_resposta.get(new Random().nextInt(2));
		mp = MediaPlayer.create(getBaseContext(), mapa_som.get(som_animal));
		
		if (rodadaAtual > 0 && !travado) {
			mp.start();
			aux_resposta.remove(som_animal);
		}
	}

	private void setarParametrosIniciais() {
		
		ponteiroCronometro = 0;
		rodadaAtual++;
		mostraRodadas.setText(rodadaAtual + "/" + numeroRodadas);
		
		Collections.shuffle(nome_animais);
		
		aux_resposta.clear();
		som_animais.clear();
		
		aux_resposta.add(nome_animais.get(0));
		aux_resposta.add(nome_animais.get(1));
		aux_resposta.add(nome_animais.get(2));
		
		//O animal sorteado para aparecer na imagem ser� removido da lista
		String nome_animal = nome_animais.get(new Random().nextInt(2));
		
		imagem_animais.setImageResource(mapa.get(nome_animal));
		aux_resposta.remove(nome_animal);
		
		botao1.setText(nome_animais.get(0));
		botao2.setText(nome_animais.get(1));
		botao3.setText(nome_animais.get(2));
	}
	
	
	@Override
	public void onStop() {
		contador.cancel();

		if (!tutorial) {
			travado = true;
		}
		
		super.onStop();
	}
	
	
	@Override
	protected void onPause() {
		contador.cancel();
		
		if (!tutorial) {
			travado = true;
		}
		
		super.onPause();
	}
	
	private void configuraSons() {
		mapa = new HashMap<String, Integer>();
        mapa_som = new HashMap<String, Integer>();
        
        nome_animais = new ArrayList<String>();
        som_animais =  new ArrayList<Integer>();
        
        mapa.put(getResources().getString(R.string.gato), R.drawable.cat);
		mapa.put(getResources().getString(R.string.cachorro), R.drawable.dog);
		mapa.put(getResources().getString(R.string.galo), R.drawable.cock);
		mapa.put(getResources().getString(R.string.cavalo), R.drawable.horse);
		mapa.put(getResources().getString(R.string.elefante), R.drawable.elephant);
		mapa.put(getResources().getString(R.string.leao), R.drawable.lion);
		mapa.put(getResources().getString(R.string.pato), R.drawable.pato);
		mapa.put(getResources().getString(R.string.porco), R.drawable.porco);
		mapa.put(getResources().getString(R.string.lobo), R.drawable.lobo);
		mapa.put(getResources().getString(R.string.ovelha), R.drawable.ovelha);
		mapa.put(getResources().getString(R.string.sapo), R.drawable.sapo);
		mapa.put(getResources().getString(R.string.grilo), R.drawable.grilo);
		
		
		mapa_som.put(getResources().getString(R.string.gato), R.raw.gato7);
		mapa_som.put(getResources().getString(R.string.cachorro), R.raw.cachorro06);
		mapa_som.put(getResources().getString(R.string.galo), R.raw.galo1);
		mapa_som.put(getResources().getString(R.string.cavalo), R.raw.cavalo3);
		mapa_som.put(getResources().getString(R.string.elefante), R.raw.elephant);
		mapa_som.put(getResources().getString(R.string.leao), R.raw.lion);
		mapa_som.put(getResources().getString(R.string.pato), R.raw.duck);
		mapa_som.put(getResources().getString(R.string.porco), R.raw.pigs);
		mapa_som.put(getResources().getString(R.string.lobo), R.raw.lobo);
		mapa_som.put(getResources().getString(R.string.ovelha), R.raw.ovelha);
		mapa_som.put(getResources().getString(R.string.sapo), R.raw.sapo);
		mapa_som.put(getResources().getString(R.string.grilo), R.raw.grilo);
		
		
		nome_animais.add(getResources().getString(R.string.gato));
		nome_animais.add(getResources().getString(R.string.cachorro));
		nome_animais.add(getResources().getString(R.string.galo));
		nome_animais.add(getResources().getString(R.string.cavalo));
		nome_animais.add(getResources().getString(R.string.elefante));
		nome_animais.add(getResources().getString(R.string.leao));
		nome_animais.add(getResources().getString(R.string.pato));
		nome_animais.add(getResources().getString(R.string.porco));
		nome_animais.add(getResources().getString(R.string.lobo));
		nome_animais.add(getResources().getString(R.string.ovelha));
		nome_animais.add(getResources().getString(R.string.sapo));
		nome_animais.add(getResources().getString(R.string.grilo));
		
	}

	private void configuraCronometro() {
        
        contador = new CountDownTimer(TEMPO_LIMITE , TEMPO_LIMITE/QTDE_QUADROS_DE_LOADING ) {

      	     public void onTick(long millisUntilFinished) {
      	    	 tempoParcial += 40;
      	    	 
      	    	 if (ponteiroCronometro == imgsCronometro.length-1) {
      	    		 ponteiroCronometro = 0;
      	    	 }
      	    	 ponteiroCronometro++;
      	    	 layoutCronometro.setBackgroundResource(imgsCronometro[ponteiroCronometro]);
      	     }

      	     public void onFinish() {
      	    	 ponteiroCronometro = 0;
      	    	 layoutCronometro.setBackgroundResource(imgsCronometro[10]);

      	    	 if (rodadaAtual != -1) {   // por causa do bug do ajuda :P
      	    		 
      	    		 idadeMental += (tempoParcial/10)+50;
      	    		 
      	    		 setContentView(R.layout.fim_tempo);
      	    		 
      	    		 Handler handler = new Handler(); 
      	    		 handler.postDelayed(new Runnable() { 
      	    			 public void run() {
      	    				 novaRodada();
      	    			 } 
      	    		 }, 500);
      	    		 
      	    	 }
      	     }
       	}.start();
	}

	private void carregaViews() {
		botao1 = (Button) findViewById(R.id.button_animals1);
        botao2 = (Button) findViewById(R.id.button_animals2);
        botao3 = (Button) findViewById(R.id.button_animals3);
        
        botao1.setOnClickListener(this);
        botao2.setOnClickListener(this);
        botao3.setOnClickListener(this);
        
        imagem_animais = (ImageView) findViewById(R.id.image);
        mostraRodadas = (TextView) findViewById(R.id.txt_rodadas);
        
        layoutCronometro = (LinearLayout) findViewById(R.id.layout_cronometro_animais);
        imgsCronometro = new int[]{R.drawable.um,R.drawable.dois, R.drawable.tres, R.drawable.quatro,R.drawable.cinco,R.drawable.seis,R.drawable.sete,R.drawable.oito,R.drawable.nove,R.drawable.dez, R.drawable.onze};
	}

	
	public void onClick(View v){
		
		contador.cancel();
		semclick = false;
		mp.stop();
		
		switch(v.getId()){
		case R.id.button_animals1:
			
			if (aux_resposta.contains(botao1.getText())){
				acertou();
			} else {
				errou();
			}
			break;
		
	    case R.id.button_animals2:
	    	
		    if (aux_resposta.contains(botao2.getText())){
		    	acertou();
		    } else {
		    	errou();
		    }
		    break;
		    
	    case R.id.button_animals3:
	    	
		    if (aux_resposta.contains(botao3.getText())){
		    	acertou();
		    } else {
		    	errou();
		    }
		    break;
		}
	}

	private void errou() {
		
		idadeMental += (tempoParcial/10)+50;  // ok!
		
		player.erro();
		setContentView(R.layout.errou);
		
		Handler handler = new Handler(); 
		handler.postDelayed(new Runnable() { 
			public void run() {
				novaRodada();
			} 
		}, 500); 
		
	}

	private void acertou() {
		
		idadeMental += tempoParcial/10;  // ok!
		
		player.acerto();
		setContentView(R.layout.acertou);
		
		Handler handler = new Handler(); 
		handler.postDelayed(new Runnable() { 
			public void run() {
				novaRodada();
			} 
		}, 500);
	}

	private void novaRodada() {
		
		if (fimDeJogo()) {
			idadeMental = idadeMental/numeroRodadas;  // ok!
			
			setContentView(R.layout.resultado);
			TextView mText = (TextView) findViewById(R.id.resultadoIdade);
			
			TextView novoRecordText = (TextView) findViewById(R.id.txt_ha_recorde);
			
			if (semclick) {
				mText.setText( getResources().getString(R.string.morto) );	
			}
			else {
				mText.setText( idadeMental + "");
			}
			
			mText.setVisibility(View.VISIBLE);
			
			if (travado) {
				return;
			}
			
			if (novoRecord()) {
				player.aplausos();
				novoRecordText.setVisibility(View.VISIBLE);
			}
			
			Handler han = new Handler();
			han.postDelayed(new Runnable() { 
				public void run() {
					finalizaMinigame();
				} 
			}, 2000);
			
		} else {
			contador.cancel();
			onStart();
		}
	}
	
	private boolean novoRecord() {
		SharedPreferences config = getSharedPreferences(RegistraRecordActivity.RECORDES, 0);
		int maiorIdadeRecord = config.getInt("idade_cinco", Integer.MAX_VALUE);
		
		if (idadeMental < maiorIdadeRecord) {
			return true;
		}
		return false;
	}
	
	
	private void finalizaMinigame() {
		
		if (novoRecord()) {
			Intent i = new Intent(this, RegistraRecordActivity.class);
			i.putExtra("novo_record", idadeMental);
			startActivity(i);
		}
		
		finish();
	}

	private boolean fimDeJogo() {
		return rodadaAtual == numeroRodadas;
	}
	
}
